home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / BLDSADDR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  1.8 KB  |  79 lines

  1. #include "global.h"
  2. #ifdef TCPGATE
  3. #include "ctype.h"
  4.  
  5. #ifdef UNIX
  6. #include <netdb.h>
  7. #endif
  8. #include "socket.h"
  9. #include "bldsaddr.h"
  10.  
  11. #if !defined(_lint)
  12. static char rcsid[] OPTIONAL = "$Id: bldsaddr.c,v 1.11 1997/08/19 01:19:22 root Exp root $";
  13. #endif
  14.  
  15. static union {
  16.     struct sockaddr sa;
  17.     struct sockaddr_in si;
  18. } addr;
  19.  
  20. extern unsigned long int inet_addr (const char *cp);
  21.  
  22. /*---------------------------------------------------------------------------*/
  23.  
  24.  
  25. struct sockaddr *
  26. build_sockaddr (const char *name, int *addrlen)
  27. {
  28. char *host_name;
  29. char *serv_name;
  30. char buf[1024];
  31. uint32 *iptr;
  32.  
  33.     memset ((char *) &addr, 0, sizeof (addr));
  34.     *addrlen = 0;
  35.  
  36.     host_name = strncpy (buf, name, 1024);
  37.     serv_name = strchr (buf, ':');
  38.     if (!serv_name)
  39.         return 0;
  40.     *serv_name++ = 0;
  41.     if (!*host_name || !*serv_name)
  42.         return 0;
  43.  
  44.     addr.si.sin_family = AF_INET;
  45.  
  46.     if (!strcmp (host_name, "*"))
  47.         addr.si.sin_addr.s_addr = INADDR_ANY;
  48.     else if (!strcmp (host_name, "loopback"))
  49.         addr.si.sin_addr.s_addr = inet_addr ("127.0.0.1");
  50.     else if ((addr.si.sin_addr.s_addr = inet_addr (host_name)) == (unsigned long) -1L) {
  51.         struct hostent *hp = gethostbyname (host_name);
  52.  
  53.         endhostent ();
  54.         if (!hp)
  55.             return 0;
  56.         addr.si.sin_addr.s_addr = ((struct in_addr *) (hp->h_addr))->s_addr;
  57.     }
  58.     if (isdigit (*serv_name & 0xff))
  59.         (void) put16 ((unsigned char *) &addr.si.sin_port, (int16) atoi (serv_name));
  60.     else {
  61.         struct servent *sp = getservbyname (serv_name, (char *) 0);
  62.  
  63.         endservent ();
  64.         if (!sp)
  65.             return 0;
  66.         addr.si.sin_port = (int16) sp->s_port;
  67.     }
  68.  
  69.  
  70.     iptr = (uint32 *) & addr.si.sin_addr;
  71.     (void) put32 ((unsigned char *) &addr.si.sin_addr, *iptr);
  72.     (void) put16 ((unsigned char *) &addr.si.sin_port, (int16) addr.si.sin_port);
  73.     *addrlen = sizeof (struct sockaddr_in);
  74.  
  75.     return &addr.sa;
  76. }
  77.  
  78. #endif /* TCPGATE */
  79.